他の記事を見てみる
May 09 2018 / 17:44:25
プログラミング > フロントエンド >
Keyword:

何故今になってもvarは使われるのか

執筆者ホームページ

𝖢𝗋𝖾𝖺𝗍𝗂𝗏𝖾 𝖦𝖯

皆さんこんちは、CreativeGPで御座います \ ' ‿ '/

今日は未だに何故か使われているvarについての話です。

今頃let/constだろぉ!?

ここで新しいlet constが作られてからこっちのほうが安全だとかでこっち使いましょーって記事がたくさんあります。

具体的に言うとvarは巻き上げだとか不変にできないとかですかね。

しかしGitHub

しかしみなさん、GitHubを見て下さい。比較的新しいか更新が頻繁に行われている人気リポジトリでまだvarを使ってるっぽいものを集めました。(あくまで見た感じね

https://github.com/axios/axios

https://github.com/jquery/jquery

https://github.com/mrdoob/three.js

また結構最近に作られた記事でもvarを使っているのを良く見る。ここまで来ると「なんかまだvar使う理由があるのかな?」と思うのは自然な思考の流れだと思う。

さて

Twitterにツイートしてみたけど反応がないので特に理由ないけど修正がだるいだけかな−とか勝手に思ってたけどやはり気になる(特にあのリポジトリたち)のでイシュークリーム投げてみました

丁寧な回答があったので今日はその紹介です。ここまでは前置きです。

内容は


@CreativeGP it would just be compiled back to var anyway for compatibility reasons. also,
there are instances where const and let won't work, and only var will. here's an example:

https://github.com/r3wt/express-map/blob/master/index.js#L17

another common case is variables holding a primitive value that need to be "globally" scoped
but modifiable from any child scope. you can't use const or let for that. additionally, you can't declare const or let inside of a switch statement.

で、まとめると「互換性のためとかvarを特別に使う事例があるんだよ」って感じですね。下の方は他の方から反論が来てるので触れないことにします。†‡

互換性?

互換性?まだlet対応してないブラウザとかあんの?とか思ったけど調べてみるとOpera Miniってやつがまだ対応していないようですね。

まあ自分はあんまり気にしませんけどね。††

特別な事例?

これがメインです。ご存知の通りvarは巻き上げが発生します。ブロック内で使うとコードが分かりにくくなります。ただそれを利用する事例もあるよ、ってことですね。これが知りたかった。

どんな事例かと言うと、この例で行くと「アプリのスタート時に作られて欲しい変数」です。巻き上げの特性を利用して上に書けない何らかの理由のある変数をスタートアップと同時に作りたい場合に使える、という訳ですね。

varみるだけで、なんだよこのコード!!!となってたのですが、それは気が早すぎることが分かりました。やはり聞いてみるのは大切ですね。

ノシ

† Object.freezeとか使ってそれっぽくはできるのかもしれないけど面倒だし

†‡ ちなみに自分はこれは間違ってると思ってます

†† こんなこと気にしなきゃならないほど有名なプロジェクトの開発に携わってみたいよ...